package com.designpattern.softwaredesignpatternstudy.pattern.proxy.application.dynamic;

import java.lang.reflect.Proxy;

/**
 * @Author: Jiangxx
 * @Date: 2022/03/11
 * @Description: JDK动态代理测试类
 */
public class DynamicProxyTest {
    public static void main(String[] args) {
        // 代理的真实对象
        RealSubject realSubject = new RealSubject();

        /**
         * InvocationHandlerImpl 实现了 invocationhandler接口，并能实现方法调用从代理类到委托类
         * 的分派转发，其内部通常包含指向委托类实例的引用，用于真正执行分派转发过来的方法调用
         * 即：要代理哪个真实对象，就将该对象传进去，最后是通过该真实对象来调用其方法
         */
        InvocationHandlerImpl invocationHandler = new InvocationHandlerImpl(realSubject);

        ClassLoader classLoader = realSubject.getClass().getClassLoader();
        Class<?>[] interfaces = realSubject.getClass().getInterfaces();

        // 该方法用于为指定的类装载器、一组接口及调用处理器生成动态代理类实例
        Subject subject = (Subject) Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);

        System.out.println("动态代理对象类型：" + subject.getClass().getName());

        String litchiShell = subject.sayHello("LitchiShell");

        System.out.println(litchiShell);
    }
}
